<?php
namespace Home\Controller;
use Think\Controller;
class JieController extends CommonController {
	//每个发表新贴 成功时 展示相对应的帖子html
    public function index()
    {	
    	//该帖子的id
    	$id = I('get.id');

        //拿问题数据--展现帖子的内容、用户头像等  要连表查询出question表和user表的字段
    	$sql = "select t1.*,t2.nickname,t2.face from question t1 inner join user t2 on t1.uid=t2.id where t1.id='{$id}'";
    	//$card = M('question')->find($id); //$card[帖子]
    	$card = M()->query($sql);  //$card[帖子]
    	$card = current($card);
    	//var_dump($card);
    	$this->assign('card',$card);


    	//拿到回答该贴的所有数据 按照回答时间降序--最新的回答在最上面
    	$sql = "select t1.*,t2.nickname,t2.face from answer t1 inner join user t2 on t1.uid=t2.id where t1.qid='{$id}' order by create_time desc";
    	$answers = M()->query($sql);
    	//var_dump($answer);
    	$this->assign('answers',$answers);

    	//调用公共控制器 获取当前登录的用户所收藏的总帖子[qid]集合 并及时分配给html判断当前帖子是[收藏]还是[取消收藏]两者间的其中一种状态
    	$this->getStoreQid(); 

    	//调用公共控制器 获取当前登录的用户所赞的总回复[aid]集合 并及时分配给html判断当前回复是[赞]还是[取消赞]两者间的其中一种状态
    	$this->getZanAid();

    	//调用公共控制器 获取此贴子每次被浏览时   浏览量自动+1
    	$this->autoAdd('question','view_num',"+1",$id);

    	//调用公共控制器 获取帖子右部分的 近期热议 数据展示
    	$this->getTopAnswer();

    	//分配网络标题
    	$this->assign('title',$card['title']);
    	$this->display();
    }

    //在主页点击发表新帖按钮 执行的add方法并导出add.html(发布问题页面)
    public function add()
    {
    	//判断未登陆时直接跳转到登陆页
    	if (!isset($_SESSION['id'])) {
    		$url = U('home/login/index');
    		header("Location:".$url);
    		exit;
    	}

    	//获取重组后的父子分类
    	$cates = D('category')->getCate();
    	$this->assign('cates',$cates);

    	$question = D('verify')->getVerify();
    	$this->assign('question',$question);
    	$this->assign('title',发表新贴);
        $this->display();
    }

    //在发表新贴的页面点击 发表新贴 时处理异步过来的数据
    public function ajaxAdd()
    {	
    	//var_dump($_SESSION['id']);
    	if(I('post.title')==''){
    		$arr = array('error'=>1,'info'=>'标题不能为空!!',);
    		echo json_encode($arr);exit;
    	}
    	if(I('post.content')==''){
    		$arr = array('error'=>1,'info'=>'内容不能为空!!',);
    		echo json_encode($arr);exit;
    	}
    	if(I('post.cid')==''){
    		$arr = array('error'=>1,'info'=>'所在类别不能为空!!',);
    		echo json_encode($arr);exit;
    	}
    	if(I('post.kiss_num')==''){
    		$arr = array('error'=>1,'info'=>'悬赏飞吻不能为空!!',);
    		echo json_encode($arr);exit;
    	}
    	if(I('post.verify')==''){
    		$arr = array('error'=>1,'info'=>'人类验证不能为空!!',);
    		echo json_encode($arr);exit;
    	}

    	$title = I('post.title');
    	$preg = '/^[\w|\W]{15,}$/';
        $c = preg_match($preg, $title);
        if (!$c) {
            $arr = array('error'=>1,'info'=>'标题过于简陋!!!',);
            echo json_encode($arr);exit;
        }

        $verify = I('post.verify');
        if ($verify!=$_SESSION['answer']) {
            $arr = array('error'=>1,'info'=>'人类验证失败!!!',);
            echo json_encode($arr);exit;
        }
        
        //当内容为 空格&nbsp; &nbsp; &nbsp; 时未处理
        //
        //
        //
        

        //检测内容低于10个汉字 则返回提示
        $content = I('post.content'); //原输入的内容layer自动增加html标签的 但I方法接过来后[出于安全考虑]自动转成了实体
        $contents = htmlspecialchars_decode($content); //把实体的$content 转成HTML格式
        $contents = strip_tags($contents);  //去掉所有HTML标签后的 内容 给正则判断
        //var_dump($contents);
        $preg = "/^[\w|\W]{30,}$/";
        $c = preg_match($preg, $contents);
        if (!$c) {
            $arr = array('error'=>1,'info'=>'内容过于简陋!!!',);
            echo json_encode($arr);exit;
        }

        //检测已拥有的飞吻值若低于悬赏的飞吻值 则返回提示
        $id = $_SESSION['id'];
        $sql = "select kiss from user where id='{$id}'";
        $res = M('user')->query($sql);
        $res = current($res);
        $kiss = $res['kiss'];
        $kiss_num = I('post.kiss_num');
        if ($kiss<I('post.kiss_num')) {
        	$arr = array('error'=>1,'info'=>"您所拥有的飞吻值低于 ".$kiss_num." !!!",);
            echo json_encode($arr);exit;
        }


        //全部通过时执行发表新贴 把新数据插入数据库
        $data = I('post.');
        $data['uid'] = $id;
        $data['create_time'] = time();
        //$zzid = M('question')->add($data)  $insertid为成功添加数据时返回的自增id
        if($insertid = M('question')->add($data)){
        	//扣除飞吻 未处理
        	//
        	

            //返回url方便每次发帖时跳转到对应的 帖子html   路径传参为数组形式
        	$arr = array('error'=>0,'info'=>'发贴成功!!!','url'=>U('home/jie/index',array('id'=>$insertid)));
            echo json_encode($arr);exit;
        }else{
        	$arr = array('error'=>1,'info'=>'发贴失败!!!',);
            echo json_encode($arr);exit;
        }

    }

    //[发表新帖]及[提交回复]时点击 插入图片 调用的方法
    public function uploadImage()
    {
    	//var_dump($_FILES);
    	$upload = new \Think\Upload();// 实例化上传类
        $upload->maxSize   =     3145728 ;// 设置附件上传大小
        $upload->exts      =     array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
        $upload->rootPath  =     './UpAddImg/'; // 设置附件上传根目录
        $upload->savePath  =     ''; // 设置附件上传（子）目录
        // 上传文件  //上传后的文件放在$info里
        $info   =   $upload->upload();
        // var_dump($info);
        // <pre class='xdebug-var-dump' dir='ltr'>
        // <b>array</b> <i>(size=1)</i>
        //   'upload_file' <font color='#888a85'>=&gt;</font> 
        //     <b>array</b> <i>(size=9)</i>
        //       'name' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'168.jpg'</font> <i>(length=7)</i>
        //       'type' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'image/jpeg'</font> <i>(length=10)</i>
        //       'size' <font color='#888a85'>=&gt;</font> <small>int</small> <font color='#4e9a06'>9421</font>
        //       'key' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'upload_file'</font> <i>(length=11)</i>
        //       'ext' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'jpg'</font> <i>(length=3)</i>
        //       'md5' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'0cb9754f4aff63c61b7600b971950d27'</font> <i>(length=32)</i>
        //       'sha1' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'ae414571dbac185d5cd9488fb7aa47a2bfc91723'</font> <i>(length=40)</i>
        //       'savename' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'59aabfc848b66.jpg'</font> <i>(length=17)</i>
        //       'savepath' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'2017-09-02/'</font> <i>(length=11)</i>
        // </pre>上传成功！
        if(!$info) {// 上传错误提示错误信息
            echo $upload->getError();
        }else{// 上传成功
            $info = current($info);
            $path = __ROOT__."/UpAddImg/".$info['savepath'].$info['savename'];
            
            $arr = array(
            	'code'=>0, //0表示成功，其它失败
            	'msg'=>'成功',  //提示信息 //一般上传失败后返回
            	'data'=>array(
            		  'src'=>$path,
            		  'title'=>"图片名称", //可选
            		  ),
            	);
            echo json_encode($arr);

            //也就是说LayEdit并不提供服务端的图片接受，但你需要在图片上传成功后对LayEdit返回如下格式的JSON信息：
              // "code": 0 //0表示成功，其它失败
			  // ,"msg": "" //提示信息 //一般上传失败后返回
			  // ,"data": {
			  //   "src": "图片路径"
			  //   ,"title": "图片名称" //可选
			  //       }
        }
    }

    //在帖子的页面点击 提交回复 时处理异步过来的数据
    public function ajaxAddAnswer()
    {
    	//var_dump($_POST);
    	//检测未登陆时 返回提示
    	if (!isset($_SESSION['id'])) {
    		$arr = array('error'=>1,'info'=>'未登陆无法回复!!',);
            echo json_encode($arr);exit;
    	}
    	if(I('post.content')==''){
    		$arr = array('error'=>1,'info'=>'回复内容不能为空!!',);
    		echo json_encode($arr);exit;
    	}

    	//检测内容低于5个汉字 则返回提示
        $content = I('post.content'); //原输入的内容layer自动转成html标签的 但I方法接过来后[出于安全考虑]自动转成了实体
        $contents = htmlspecialchars_decode($content); //把实体的$content 转成HTML格式
        $contents = strip_tags($contents);  //去掉所有HTML标签后的 内容 给正则判断
        //回复内容全部为表情时 $contents=''  空字符串!!??
        //var_dump($contents);
        $preg = "/^[\w|\W]{15,}$/";
        $c = preg_match($preg, $contents);
        if (!$c) {
            $arr = array('error'=>1,'info'=>'回复内容过于简陋!!',);
            echo json_encode($arr);exit;
        }

        //当内容为 空格&nbsp; &nbsp; &nbsp; 时未处理
        //
        //
        //

        //执行回复 当回复成功时执行autoAdd自增回复量+1 并且 自增回复者的 问题回答量+1
        $data = I('post.');
        $data['uid'] = $_SESSION['id']; //$_SESSION['id']为当前回复者的id 对应answer表的uid
        $data['create_time'] = time();
        
        if (M('answer')->add($data)) {
        	//自增该贴的回复量+1  answer表的I('post.qid')对应question的id
        	$this->autoAdd('question','answer_num',"+1",I('post.qid'));

        	//自增回复者的 问题回答量+1
        	$this->autoAdd('user','answer_num',"+1",$_SESSION['id']);

        	$arr = array('error'=>0,'info'=>'回复成功!!',);
            echo json_encode($arr);exit;
        }else{
        	$arr = array('error'=>1,'info'=>'回复失败!!',);
            echo json_encode($arr);exit;
        }


    }

    //点击[收藏]或[取消收藏] 执行 处理异步过来的数据
    public function ajaxStore()
    {	
    	$qid = I('post.qid');
    	$uid = I('post.uid');

    	$ifStore = M('store')->where("qid='{$qid}' and uid='{$uid}'")->find(); //$ifStore  是否已收藏 
    	if ($ifStore) {
    		//已经收藏时   执行删除
    		//M('store')->where("qid='{$qid}' and uid='{$uid}'")->delete();
    		M('store')->delete($ifStore['id']); //删除收藏id
    		$arr = array('error'=>0,'info'=>'已取消收藏!!',);
            echo json_encode($arr);exit;
    	}else{
    		//否则还没收藏时  执行收藏
    		$data = I('post.');
    		$data['create_time'] = time();
    		M('store')->add($data);
    		$arr = array('error'=>1,'info'=>'已收藏!!',);
            echo json_encode($arr);exit;
    	}

    }

    //点击[赞]或[取消赞] 执行 处理异步过来的数据
    public function ajaxZan()
    {
    	$id = I('post.answerid'); //$id 对应回答表的自增id
    	$uid = $_SESSION['id'];   //$uid  对应回答表的uid

    	if (!isset($_SESSION['id'])) {
    		$arr = array('error'=>4,'info'=>'未登陆无法点赞!!',); //返回4
            echo json_encode($arr);exit;
    	}

    	//判断该回复是否为登陆者自己的回复  若是则无法赞自己
    	if (M('answer')->where("id='{$id}' and uid='{$uid}'")->find()) {
    		$arr = array('error'=>4,'info'=>'不要尝试着给自己点赞!!',); //返回4
            echo json_encode($arr);exit;
    	}else{
    		//否则 判断该回复 是否已经被登陆者点过赞
    		$ifZan = M('zan')->where("aid='{$id}' and uid='{$uid}'")->find(); //$ifZan  是否已赞
    		if ($ifZan) {
    			//已赞   执行删除
    			M('zan')->delete($ifZan['id']); //删除赞表id
    			$this->autoAdd('answer','zan_num',"-1",$id); //执行对应的回复表 赞-1
    			$res = M('answer')->where("id='{$id}'")->find(); //查询执行完赞-1 后的回复表 获取该回复的最新的zan_num JSON返回
	    		$arr = array('error'=>0,'info'=>'取消赞 -1 !!','zan_num'=>$res['zan_num']);//返回0
	            echo json_encode($arr);exit;
    		}else{
    			//否则还没赞时  执行赞
    			$data['aid'] = $id;
	    		$data['uid'] = $uid;
	    		$data['create_time'] = time();
	    		M('zan')->add($data);
	    		$this->autoAdd('answer','zan_num',"+1",$id); //执行对应的回复表 赞+1
	    		$res = M('answer')->where("id='{$id}'")->find(); //查询执行完赞+1 后的回复表 获取该回复的最新的zan_num JSON返回
	    		$arr = array('error'=>1,'info'=>'已赞 +1 !!','zan_num'=>$res['zan_num']);//返回1
            	echo json_encode($arr);exit;
    		}
    	}


    }

    //主页点击搜索  执行so
    public function so()
    {
    	//var_dump($_GET['q']);
    	$text = I('get.q');
    	Vendor('Pscws4.pscws4','','.class.php');//引入类  有class要加 '.class.php'
    	$pscws = new \PSCWS4('utf8');  //实例化 由于PSCWS4是第三方类  前面要加\ 表示不属于任何命名空间下的类
    	//var_dump($pscws);
    	// 接下来, 设定一些分词参数或选项, set_dict 是必须的, 若想智能识别人名等需要 set_rule 
    	$pscws->set_dict('./Public/dict.utf8.xdb');	 //设置词库 从单入口出发 './Public/dict.utf8.xdb'
    	// 分词调用 send_text() 将待分词的字符串传入, 紧接着循环调用 get_result() 方法取回一系列分好的词
		// 直到 get_result() 返回 false 为止
		// 返回的词是一个关联数组, 包含: word 词本身, idf 逆词率(重), off 在text中的偏移, len 长度, attr 词性
		$pscws->send_text($text); //把需要处理的文本 传入 send_text()
		// 在 send_text 之后可以调用 get_tops() 返回分词结果的词语按权重统计的前 N 个词
		// 常用于提取关键词, 参数用法参见下面的详细介绍.
		// 返回的数组元素是一个词, 它又包含: word 词本身, weight 词重, times 次数, attr 词性
		$tops = $pscws->get_tops(3, 'n,v');  //统计权重  [拆出来的词的个数]
		var_dump($tops);

		if(!empty($tops)){ //当词库不为空时执行查询 
			$sql = "select * from question where ";
			foreach ($tops as $v) {
				$sql = $sql."title like '%".$v['word']."%' or ";  //注意 '%值%'  要加单引号
			}
			$sql = rtrim($sql,'or ');
			$res = M()->query($sql);
			//var_dump($res);exit;
		}
		//如果根据分词匹配  得到数据时  分配变量
		if (!empty($res)){
			//根据每条问题数据集合[$res]连表 查出详细数据
			$innerSql = "select t1.*,t2.nickname,t2.face,t3.cname from question t1 inner join user t2 on t1.uid=t2.id inner join category t3 on t1.cid=t3.id where ";//order by create_time desc
			foreach ($res as $uid) {
				//var_dump($uid['uid']);
				$innerSql = $innerSql."uid='".$uid['uid']."' or ";
			}
			$innerSql = rtrim($innerSql,'or ');
			$innerSql = $innerSql." order by create_time desc";
			//var_dump($innerSql);
			$sores = M()->query($innerSql);
			//var_dump($sores);

			// $str = "UooU-Pavicok";
			// $str = str_ireplace('o', 'Xx', $str); //有i对大小写不敏感 没i敏感  replace替换
			// var_dump($str);
			// 循环处理 $sores里的标题  把搜索得到的 词染红
			
			foreach ($sores as $k => $title) {
				$str = ($title['title']);
				$sores[$k]['title'] = []; //以数组类型存放被染红的标题
				//var_dump($str);
				foreach ($tops as $v) {
					//var_dump($v['word']);
					$sores[$k]['title'] []= str_ireplace($v['word'], "<span style='color:#c00'>".$v['word']."</span>", $str);
					//未处理[下面的循环已处理]  当匹配到多个权重时 只有最后一个权重才染红  有的被覆盖而不显示红??
					//未处理  多处染红效果未处理
				}
			}
			//var_dump($sores); //此时的$sores的标题为 权重里匹配到的数组形式的 染红标题
			foreach ($sores as $k => $v) {
				$title = ($v['title']);
				foreach ($title as $v) {
					//var_dump($v);
					$preg = '/^(\w|\W)*[<]\/[s][p][a][n][>](\w|\W)*$/';
					$c = preg_match($preg, $v);
					if($c){
						//var_dump($v);
						$sores[$k]['title'] = $v;
					}
				}
			}
			//var_dump($sores);
			$this->assign('sores',$sores);
		}
		
		$this->assign('title',搜索);
    	$this->display();
    }



}
